/**
 * 5.3 构造函数
 */
// 5.3.1 为什么使用构造函数
function factory(name, age) {
    var o = {};//创建一个空的对象
    o.name = name;//添加name属性
    o.age = age;//添加age属性
    return o;//将对象返回
}

var o1 = factory("Jack", 18);
var o2 = factory("Alice", 19);
console.log("5.3.1 为什么使用构造函数")
console.log(o1);
console.log(o2);

//5.3.2 JavaScript内置的构造函数
console.log("5.3.2 JavaScript内置的构造函数");
//通过构造函数创建对象
var obj = new Object();//创建Object对象
var str = new String();//创建String对象
//查看对象是由哪个构造函数创建的
console.log(obj.constructor);
console.log(str.constructor);
console.log({}.constructor);

//5.3.4 私有成员
console.log("5.3.4 私有成员")

function Person() {
    var name = "Jim";//私有成员
    this.getName = function () {//公有成员
        return name;
    };
}

var p = new Person();//创建实例对象p
console.log(p.name);//访问私有成员，输出结果：undefinded
console.log(p.getName());//访问对外开放的成员，输出结果：Jim

//多学一招
//返回基本数据类型 则返回的数据无效 依然会返回原来创建的对象
function Person1() {
    obj1 = this;
    return 123;//返回基本数据类型
}

var obj1, p1 = new Person1();
console.log(p1 === obj1);//ture

//返回一个数组或对象等引用类型数据，则构造函数会直接返回该数据，而不会返回原来创建的对象
function Person2() {
    obj2 = this;
    return {};//返回引用类型数据
}

var obj2, p2 = new Person2();
console.log(p2 === obj2); //false

//5.3.5 函数中的this指向
console.log("5.3.5 函数中的this指向")

//1.分析this指向
function foo() {
    return this;
}

var o3 = {name: "Jim", func: foo};
console.log(foo() === window);//直接通过函数名调用式，this指向的式全局对象 window
console.log(o3.func() === o3);//如果将函数作为对象的方法调用，this将会指向该对象

//2.更改this指向
function method() {
    console.log(this.name);
}
method.apply({name:"张三"});
method.call({name:"李四"});

function method2(a,b) {
    console.log(this.name+a+b);
}
var name="张三";
var test=method2.bind({name:'李四'},'5','6');//bind()方法的含义式绑定
method2.apply({name:"张三"},['1','2']);//数组方式传参 结果：12
method2.call({name:"张三"},'3','4');//参数方式传参 结果：34
test();





